package com.yzy.custom.udf;

import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;

public class MyGenericUDFdemo1 extends GenericUDF {
    /*
    这个方法主要是对自定义的UDF进行初始化，目的是指定调用完函数返回值的类型
    需求：传入一个字符串，返回一个新的字符串
    举例：SMITH --> 数加：SMITH
     */
    @Override
    public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentException {
        //使用PrimitiveObjectInspectorFactory工厂类，获取String类型的ObjectInspector
        return PrimitiveObjectInspectorFactory.javaStringObjectInspector;
    }
    /*
       该方法是自定义UDF的核心方法，目的是实现自定义UDF的逻辑
       是在initialize方法之后执行的

       arguments将来会有多个参数，但是UDF函数只有一个参数，所有arguments[0]就是传入的第一个参数
        */
    @Override
    public Object evaluate(DeferredObject[] arguments) throws HiveException {
        String output = "";
        //arguments[0]获取第一个参数值，通过get()方法获取其中的参数具体值
        Object o = arguments[0].get();
        if (o != null) {//如果将来调用自定义函数不传值的话则o为null,需要加入判断，防止空指针异常
            if (o instanceof Text) {
                output = "帅比:" +o;
            } else if (o instanceof IntWritable) {//对象运算符(instanceof)用来判断一个对象是否属于某个指定的类或其子类的实例，如果是，返回真(true)，否则返回假(false)
                int score = ((IntWritable) o).get();
                if (score>=90 && score<=100) {
                    output = "优秀";
                } else if (score>=70 && score<90) {
                    output = "良好";
                } else if (score>=60) {
                    output = "及格";
                }else {
                    output = "不及格";
                }

            }

        }
        return output;
    }

    @Override
    public String getDisplayString(String[] children) {
        return "新版本就是强势！！";
    }
}
